﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Sisco.AplicacionEscritorio.Util;

namespace Sisco.AplicacionEscritorio.Programa
{
    public partial class AsignarPrograma : Form
    {
        BindingList<AccesoDatos.PROGRAMA> programasAsignados;

        public AsignarPrograma()
        {
            InitializeComponent();
            programasAsignados = new BindingList<AccesoDatos.PROGRAMA>();
        }

        private void AsignarPrograma_Load(object sender, EventArgs e)
        {
            ListarProgramas();
            gridProgramasAsignados.DataSource = programasAsignados;            
        }

        private void ListarProgramas()
        {
            LogicaNegocio.ProgramaBLL programaBLL = new LogicaNegocio.ProgramaBLL();
            gridProgramasRegistrados.DataSource = programaBLL.Listar();
            gridProgramasRegistrados.ClearSelection();
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            FormularioBuscar formBusqueda = new FormularioBuscar();
            
            if (rbEquipo.Checked)
            {
                formBusqueda = new FormularioBuscar("Equipo");
            }
            else if (rbUsuario.Checked)
            {
                formBusqueda = new FormularioBuscar("Usuario");
            }

            formBusqueda.ShowDialog(this);

            if (formBusqueda.ObjetoBuscado != null)
            {
                if (rbEquipo.Checked)
                {
                    List<AccesoDatos.EQUIPO> listaEquipos = new List<AccesoDatos.EQUIPO>();
                    AccesoDatos.EQUIPO equipo = formBusqueda.ObjetoBuscado as AccesoDatos.EQUIPO;
                    listaEquipos.Add(equipo);
                    gridEquiposBusqueda.DataSource = listaEquipos;
                }
                else if (rbUsuario.Checked)
                {
                    AccesoDatos.USUARIO usuario = formBusqueda.ObjetoBuscado as AccesoDatos.USUARIO;
                    LogicaNegocio.EquipoBLL equipoBLL = new LogicaNegocio.EquipoBLL();
                    gridEquiposBusqueda.DataSource = equipoBLL.ListarEquiposconProgramas(usuario);
                }
            }
        }

        private void gridEquiposBusqueda_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (gridEquiposBusqueda.DataSource != null)
            {
                gridEquiposBusqueda.Columns["ID"].Visible = false;
                gridEquiposBusqueda.Columns["IDUSUARIO"].Visible = false;
                gridEquiposBusqueda.Columns["IDEQUIPO"].Visible = false;
                gridEquiposBusqueda.Columns["IDTIPOEQUIPO"].Visible = false;
                gridEquiposBusqueda.Columns["IDESTADO"].Visible = false;
                gridEquiposBusqueda.Columns["TIPOEQUIPO"].Visible = false;
                gridEquiposBusqueda.Columns["MARCA"].HeaderText = "Marca";
                gridEquiposBusqueda.Columns["MODELO"].HeaderText = "Modelo";
                gridEquiposBusqueda.Columns["SERIE"].HeaderText = "Serie";
                gridEquiposBusqueda.Columns["ELIMINADO"].Visible = false;
                gridEquiposBusqueda.Columns["IDUSUARIOANTIGUO"].Visible = false;
                gridEquiposBusqueda.Columns["ASIGNADO"].Visible = false;
                gridEquiposBusqueda.Columns["FECHAREGISTRO"].Visible = false;
                gridEquiposBusqueda.Columns["REGISTRADOPOR"].Visible = false;
                gridEquiposBusqueda.Columns["FECHAMODIFICACION"].Visible = false;
                gridEquiposBusqueda.Columns["MODIFICADOPOR"].Visible = false;
                gridEquiposBusqueda.Columns["NOMBEQUIPO"].Visible = false;
                gridEquiposBusqueda.Columns["EQUIPO_ESTADO"].Visible = false;
                gridEquiposBusqueda.Columns["TIPOEQUIPO1"].HeaderText = "Tipo de equipo";
                gridEquiposBusqueda.Columns["MOVIMIENTO"].Visible = false; 
                gridEquiposBusqueda.Columns["RELACION_EQUI_PROG"].Visible = false;
                gridEquiposBusqueda.Columns["USUARIO"].Visible = false;
            }
        }

        private void gridEquiposBusqueda_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (gridEquiposBusqueda.Columns[e.ColumnIndex].Name == "TIPOEQUIPO1")
            {
                AccesoDatos.TIPOEQUIPO tipoequipo = e.Value as AccesoDatos.TIPOEQUIPO;

                if (tipoequipo != null)
                {
                    e.Value = tipoequipo.NOMBRETIPO.Trim();
                }
            }
        }

        private void gridProgramasInstalados_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (gridProgramasInstalados.DataSource != null)
            {
                gridProgramasInstalados.Columns["ID"].Visible = false;
                gridProgramasInstalados.Columns["IDPROGRAMA"].Visible = false;
                gridProgramasInstalados.Columns["NOMBREPROGRAMA"].HeaderText = "Programa";
                gridProgramasInstalados.Columns["NOMBREPROGRAMA"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                gridProgramasInstalados.Columns["ELIMINADO"].Visible = false;
                gridProgramasInstalados.Columns["FECHAREGISTRO"].Visible = false;
                gridProgramasInstalados.Columns["RELACION_EQUI_PROG"].Visible = false;
            }
        }

        private void gridProgramasRegistrados_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (gridProgramasRegistrados.DataSource != null)
            {
                gridProgramasRegistrados.Columns["ID"].Visible = false;
                gridProgramasRegistrados.Columns["IDPROGRAMA"].Visible = false;
                gridProgramasRegistrados.Columns["NOMBREPROGRAMA"].HeaderText = "Programa";
                gridProgramasRegistrados.Columns["NOMBREPROGRAMA"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                gridProgramasRegistrados.Columns["ELIMINADO"].Visible = false;
                gridProgramasRegistrados.Columns["FECHAREGISTRO"].Visible = false;
                gridProgramasRegistrados.Columns["RELACION_EQUI_PROG"].Visible = false;
            }
        }

        private void gridProgramasAsignados_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (gridProgramasAsignados.DataSource != null)
            {
                gridProgramasAsignados.Columns["ID"].Visible = false;
                gridProgramasAsignados.Columns["IDPROGRAMA"].Visible = false;
                gridProgramasAsignados.Columns["NOMBREPROGRAMA"].HeaderText = "Programa";
                gridProgramasAsignados.Columns["NOMBREPROGRAMA"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                gridProgramasAsignados.Columns["ELIMINADO"].Visible = false;
                gridProgramasAsignados.Columns["FECHAREGISTRO"].Visible = false;
                gridProgramasAsignados.Columns["RELACION_EQUI_PROG"].Visible = false;
            }
        }

        private void gridEquiposBusqueda_SelectionChanged(object sender, EventArgs e)
        {
            if (gridEquiposBusqueda.SelectedRows.Count > 0)
            {
                AccesoDatos.EQUIPO selectedEquipo = gridEquiposBusqueda.SelectedRows[0].DataBoundItem as AccesoDatos.EQUIPO;

                LogicaNegocio.EquipoProgramaBLL equipoProgramaBLL = new LogicaNegocio.EquipoProgramaBLL();
                gridProgramasInstalados.DataSource = equipoProgramaBLL.ListarProgramas(selectedEquipo);
            }
        }

        private void btnMoverA_Click(object sender, EventArgs e)
        {
            if (gridProgramasRegistrados.SelectedRows.Count > 0)
            {
                foreach (DataGridViewRow selectedRow in gridProgramasRegistrados.SelectedRows)
                {
                    AccesoDatos.PROGRAMA selectedPrograma = selectedRow.DataBoundItem as AccesoDatos.PROGRAMA;

                    List<AccesoDatos.PROGRAMA> programasInstalados = gridProgramasInstalados.Rows.Count > 0 ? gridProgramasInstalados.DataSource as List<AccesoDatos.PROGRAMA> : new List<AccesoDatos.PROGRAMA>();

                    if (programasInstalados.Find(x=> x.ID == selectedPrograma.ID)  == null)
                    {
                        if (!programasAsignados.Contains(selectedPrograma))
                        {
                            programasAsignados.Add(selectedPrograma);

                            gridProgramasAsignados.ClearSelection();
                        }  
                    }
                }
            }
        }

        private void btnBorrar_Click(object sender, EventArgs e)
        {
            if (gridProgramasAsignados.SelectedRows.Count > 0)
            {
                foreach (DataGridViewRow selectedRow in gridProgramasAsignados.SelectedRows)
                {
                    int index = selectedRow.Index;
                    programasAsignados.RemoveAt(index);
                }
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnAsignar_Click(object sender, EventArgs e)
        {
            if (gridEquiposBusqueda.SelectedRows.Count > 0)
            {
                if (gridProgramasAsignados.Rows.Count > 0)
                {
                    LogicaNegocio.EquipoProgramaBLL equipoProgramaBLL = new LogicaNegocio.EquipoProgramaBLL();
                    AccesoDatos.EQUIPO selectedEquipo = gridEquiposBusqueda.SelectedRows[0].DataBoundItem as AccesoDatos.EQUIPO;
                    List<AccesoDatos.PROGRAMA> lista = programasAsignados.ToList();

                    equipoProgramaBLL.Registrar(selectedEquipo, lista);

                    DialogResult dr = MessageBox.Show("Programas asignados.\n¿Continúa con la asignación de programas?", "Sisco", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);

                    if (dr == DialogResult.Yes)
                    {
                        this.LimpiarFormulario();
                    }
                    else if(dr == DialogResult.No)
                    {
                        this.Close();
                    }
                }
                else
                {
                    MessageBox.Show("No hay programas por asignar", "Sisco", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
            }
            else
            {
                MessageBox.Show("Seleccione el equipo para la asignación", "Sisco", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }
        }

        private void LimpiarFormulario()
        {
            rbUsuario.Checked = true;
            rbEquipo.Checked = false;
            
            txtEquipo.ResetText();
            txtUsuario.ResetText();

            gridEquiposBusqueda.DataSource = null;
            gridProgramasInstalados.DataSource = null;

            ListarProgramas();
            programasAsignados.Clear();
        }
    }
}
